Installation et chargement de ggplot2 :
# Installation du package ggplot2
# install.packages(ggplot2)
# Mise en mƩmoire du package
library(ggplot2)Mise en mƩmoire du jeu de donnƩes diamonds :
# Chargement du jeu de donnƩes diamonds
data(diamonds)DƩtermination du nombre de lignes de ce tableau :
# Nombre de lignes de diamonds
diamondsnrow(diamonds)[1] 53940
str(diamonds)tibble [53,940 Ć 10] (S3: tbl_df/tbl/data.frame)
$ carat : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
$ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
$ depth : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
$ table : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
$ price : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
$ x : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
$ y : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
$ z : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
CrƩation de diamants_chers contenant uniquement les infos des diamants de plus de 15000 USD :
# Première méthode :
diamants_chers <- diamonds[diamonds$price > 15000, ]
# Deuxième méthode :
diamants_chers <- subset(diamonds, diamonds$price > 15000)
# Troisième méthode
library(dplyr)
diamants_chers <- diamonds %>%
filter(price > 15000)
diamants_chersNombre de diamants dont le prix dƩpasse 15000 USD :
sum(diamonds$price > 15000)[1] 1655
Proportion de diamants dont le prix dƩpasse 15000 USD
mean(diamonds$price > 15000)[1] 0.03068224
Tri du tableau par ordre de prix dƩcroissants
## Première méthode
diamants_chers_tri <- diamants_chers[order(diamants_chers$price, decreasing = TRUE), ]
## Seconde mƩthode
diamants_chers_tri <- diamants_chers %>%
arrange(desc(price))Affichage des 20 diamants les plus chers
head(diamants_chers_tri, n = 20)# Une autre faƧon de faire tout Ƨa avec le pipe et les fonctions de dplyr
library(dplyr)
diamonds %>%
filter(price >= 15000) %>%
arrange(desc(price)) %>%
print(n = 20)# Mise en mƩmoire des packages utiles
library(dplyr)
library(nycflights13)# Affichage du tableau flights dans un onglet de RStudio
View(flights)Les variables catƩgorielles sont :
tailnum (numĆ©ro dāidentification de lāavion),origin (aĆ©roport de dĆ©part de lāavion),dest (aĆ©roport de destination de lāavion),carrier (compagnie aĆ©rienne)Les valeurs sont des chaĆ®nes de caractĆØres et non des chiffres.
Consultez lāaide du jeu de donnĆ©es diamonds du package ggplot2.
library(ggplot2)
?diamondsDI1z ? La profondeur des diamands en millimĆØtresdepth est-elle diffĆ©rente de la variable z ? Il sāagit dāun ratio entre z et la moyenne des 2 autres dimensions du diamandsConsultez lāaide du package nycflights13 en tapant help(package=ānycflights13ā).
help(package="nycflights13")Consultez lāaide des 5 jeux de donnĆ©es de ce package.
?airlines
?airports
?flights
?planes
?weathervisib ? VisibilitƩ en milesweather# Nombre de lignes du tableau weather
nrow(weather)[1] 26115
library(tidyverse)
library(nycflights13)alaska_flights contient les mĆŖmes variables que flights, mais beaucoup moins de lignes : seulement 714.
alaska_flights <- flights %>%
filter(carrier == "AS")
alaska_flights1. Donnez une raison pratique expliquant pourquoi les variables dep_delay et arr_delay ont une relation positive.
Le retard au dĆ©part se rĆ©percute forcĆ©ment sur le retard Ć lāarrivĆ©e. Sauf sāil est possible pour un avion de rattraper son retard en vol, ce qui semble peu probable.
2. Quelles variables (pas nƩcessairement dans le tableau alaska_flights) pourraient avoir une corrƩlation nƩgative (relation nƩgative) avec dep_delay ? Pourquoi ? Rappelez-vous que nous Ʃtudions ici des variables numƩriques.
On peut supposer que la température, la visibilité et le rayonnement solaire sont corrélés négativement à dep_delay. Quand les conditions météos se dégradent (moins de soleil, température plus faible, plus de brouillard donc moins de visibilité) les retards augmentent car les avions et les pistes doivent être (re)mis en état plus souvent. Cela demande plus de maintenance.
3. Selon vous, pourquoi tant de points sont-il regroupés près de (0, 0) ?
La majoritĆ© des vols dĆ©collent et aterrisent Ć lāheure ou avec peu dāavance ou de retard
4. Ć quoi le point (0,0) correspond-il pour les vols dāAlaska Airlines ?
Cela correspond Ć la situation idĆ©ale de dĆ©collage et dāaterrissage Ć lāheure.
5. Citez les ƩlƩments de ce graphique/de ces donnƩes qui vous sautent le plus aux yeux ?
Il sāagit ici de rĆ©aliser lāexercice qui est demandĆ© dans la partie ārĆ©sultatsā de tout rapport ou compte rendu. Ici, il y a 4 choses Ć dĆ©crire :
On discute donc de la nature de la relation, de sa forme, de la tendance centrale (où sont situés la majorité des points) et des extrêmes.
6. CrĆ©ez un nouveau nuage de points en utilisant dāautres variables du jeu de donnĆ©es alaska_flights
Pour tenter de vérifier notre hypothèse sur le lien entre météo et retard :
ggplot(data = alaska_flights, aes(x = month, y = arr_delay)) +
geom_point()Lāargument stroke permet de spĆ©cifier lāĆ©paisseur des traits utilisĆ©s pour tracer les symboles (cercles, carrĆ©s, etc.) sur un graphique.
CrƩation du jeu de donnƩes diams :
set.seed(4532) # Afin que tout le monde récupère les mêmes lignes
diams <- diamonds %>%
sample_n(5000)CrƩation du graphique :
ggplot(diams, aes(x = carat, y = price, color = clarity)) +
geom_point(shape = 4, alpha = 0.6)Revenir sur la position des arguments esthƩtiques : dans ggplot() ou dans geom_XXX() ?
Les bandes verticales sont le rĆ©sultat dāapproximations humaines. On a tendance Ć arrondir au carat ārondā immĆ©diatement supĆ©rieur (2 au lieu de 1.98, 1.7 au lieu de 1.69, etc), car la valeur marchande dĆ©pend du carat.
CrƩation du jeu de donnƩes small_weather :
small_weather <- weather %>%
filter(origin == "EWR",
month == 1,
day <= 15)
small_weatherExpliquez pourquoi la variable time_hour identifie de maniĆØre unique le moment ou chaque mesure a Ć©tĆ© rĆ©alisĆ©e alors que ce nāest pas le cas de la variable hour.
hour est une variable entiĆØre qui prend les valeurs 0 Ć 23 chaque jour de lāannĆ©e. Indiquer quāune mesure a Ć©tĆ© faite Ć 13h nāest pas suffisant car elle a pu ĆŖtre faite nāimporte que jour. La variable time-hour contient la date et lāheure de chaque mesure, ce qui en fait un identifiant unique de chaque mesure.
Examinez la figure 4.37.
1. Quels Ć©lĆ©ments nouveaux ce graphiques nous apprend-il par rapport au graphique 4.34 ci-dessus ? Comment le āfacetingā nous aide-tāil Ć visualiser les relations entre 2 (ou 3) variables ?
La nature bimodale de la distribution de la premiĆØre figure cache en fait une distribution mensuelle des tempĆ©ratures unimodale tout Ć fait classique, et ce, pour les 3 aĆ©roports. Ce graphique nous permet Ć©galement de visualiser la variabilitĆ© mensuelle, annuelle, et entre les aĆ©roports ce qui Ć©tait impossible avec lāhistogramme synthĆ©tique de la figure 4.34.
2. à quoi correspondent les numéros 1 à 12 ?
Aux mois de lāannĆ©e
3. Ć quoi correspondent les chiffres 25, 50, 75, 100 ?
Aux tempƩratures en degrƩs farenheit
4. Ć quoi correspondent les chiffres 0, 100, 200, 300 ?
Au nombre dāobservations pour chaque catĆ©gorie
5. Observez les Ć©chelles des axes x et y pour chaque sous graphique. Quāon-tāelles de particulier ? En quoi est-ce utile ?
Elles sont toutes identiques. Elles facilitent ainsi les comparaisons entre sous-graphiques. Nous verrons peut-ĆŖtre plus tard que ce nāest pas toujours souhaitable.
6. La variabilitƩ des tempƩratures est-elle plus importante entre les aƩroports, entre les mois, ou au sein des mois ? Expliquez votre rƩflexion.
La variabilitĆ© des tempĆ©ratures entre aĆ©roports est trĆØs faible : pour un mois donnĆ©, les tempĆ©ratures observĆ©es sont distribuĆ©es de faƧon trĆØs similaire dans les 3 aĆ©roports. La variabilitĆ© entre les mois est plus importante : au sein dāun mois, la distribution des tempĆ©ratures couvre rarement plus de 30Āŗ Farenheit alors quāelle atteint presque 50Āŗ Farenheit entre les mois dāĆ©tĆ© et les mois dāhiver.
1. Quelle est la différence entre un histogramme et un diagramme bâtons ?
2. Pourquoi les histogrammes sont-ils inadaptƩs pour visualiser des donnƩes catƩgorielles ?
Parce que les barres sont collées les unes aux autres ce qui donne une impression visuelle de continuité. Par ailleurs, les barres ne peuvent pas être ré-ordonnées, ce qui est souvent nécessaire pour une variable catégorielle.
3. Quel est le nom de la companie pour laquelle le plus grand nombre de vols ont quitté New York en 2013 (je veux connaître son nom, pas juste son code) ? Où se trouve cette information ?
On examine la figure 4.47 (par exemple) et on constate que la compagnie en question a le code UA. Le nom complet de cette compagnie se trouve dans le tableau airlines. Ce tableau fait le lien entre codes et nom des compagnies aƩriennes.
La compagnie qui a affrƩtƩ le plus grand nombre de vols au dƩpart de New York en 2013 est United Air Lines Inc.
airlines4. Quel est le nom de la companie pour laquelle le plus petit nombre de vols ont quitté New York en 2013 (je veux connaître son nom, pas juste son code) ? Où se trouve cette information ?
MĆŖme dĆ©marche : il sāagit de la compagnie Skywest Airlines Inc.Ā (code OO).
La figure 4.47 et la tableau carrier_table permettent de rƩpondre aux questions suivantes
Comparez les compagnies ExpressJet Airlines (EV) et US Airways (US). De combien de fois la part de EV est-elle supĆ©rieure Ć celle dāUS ? (2 fois, 3 fois, 1.2 fois ?ā¦)
Un peu plus de 2,5
Quelle est la troisième compagnie aérienne la plus importante en terme de nombre de vols au départ de New York en 2013 ?
ExpressJet Airlines (EV)
Combien de companies aƩriennes ont moins de vols que United Airlines (UA) ?
Toutes, soit 15 au total
CrƩation du jeu de donnƩes :
# On fixe le générateur de nombres aléatoires pour choisir les mêmes lignes que dans l'exemple du livre
set.seed(1234)
# CrƩation de small_flights
small_flights <- flights %>%
sample_n(1000) %>%
filter(!is.na(arr_delay),
distance < 3000)
small_flightsCrƩation du premier graphique
ggplot(small_flights, aes(x = distance,
y = air_time,
color = origin,
shape = origin)) +
geom_point(alpha = 0.8) +
scale_color_brewer(palette = "Set1") +
labs(x = "Distance parcourue en vol (miles)",
y = "Temps de vol (minutes)",
title = "Relation entre le temps de vol et la distance parcourue",
subtitle = "Seuls les vols au dƩpart de JFK et Newark parcourent plus de 1600 miles",
color = "AƩroport de\nNew York",
shape = "AƩroport de\nNew York",
caption = "DonnƩes : small_flights") +
theme_bw()CrƩation du second graphique
ggplot(small_flights, aes(x = factor(month), fill = origin)) +
geom_bar() +
facet_wrap(~ fct_infreq(carrier), nrow = 4) +
scale_fill_brewer(palette = "Accent") +
labs(x = "Mois de l'annƩe 2013",
y = "Nombre de vols",
title = "Ćvolution mensuelle du trafic aĆ©rien New Yorkais en 2013",
subtitle = "Seules 9 compagnies aƩriennes sur 14 ont dƩservi New York toute l'annƩe",
fill = "AƩroport de\nNew York",
caption = "DonnƩes : small_flights") +
theme_bw()small_flightsExaminez les tableaux rates, storms et population du package EDAWR.
# Installation et mise en mƩmoire des packages nƩcessaires
library(tidyverse)
# install.packages("devtools")
# library(devtools)
# install_github("rstudio/EDAWR")
library(EDAWR)Affichage des tableaux :
ratesrates est un tableau rangƩ avec une variable par colonne (pays, annƩe, nombre de cas de tuberculose, population globale, et taux de malades) et une ligne par observation.
stormsstorms est un tableau rangé avec une variable par colonne (nom de la tempête, vitesse du vent en mph, pression en millibars et date à laquelle la plus forte vitesse de vent a été enregistrée) et une ligne par observation.
populationpopulation nāest pas un tableau rangĆ©. Les variables devraient ĆŖtre pays, annĆ©e et population
pivot_longer(population, col = `1995`:`2013`, names_to = "year", values_to = "pop")1. Lāobjet dauphin est-il ātidyā (autrement dit, sāagit-il de ādonnĆ©es rangĆ©esā) ? Justifiez.
# Importation du jeu de donnƩes `dauphin` :
library(readxl)
dauphin <- read_excel("dauphin.xls", na = "*", skip = 9)
names(dauphin) <- c("ID", "Sexe", "Statut", "Taille", "Age", "Cd", "Cu", "Hg", "Organe")
dauphinOui, dauphin est ātidyā. Il contient une variable par colonne, une observation par ligne. La variable ID pourrait toutefois ĆŖtre supprimĆ©e.
2. Produisez le graphique ci-dessous
ggplot(dauphin, aes(x = Age, y = Hg, color = Sexe)) +
geom_smooth(method = "lm") +
geom_point() +
facet_wrap(~ Organe, nrow = 2, scales = "free_y") +
labs(x = "Ćge (annĆ©es)",
y = "Concentration en Mercure (mg/kg)",
title = "Ćvolution de la concentration en mercure age l'Ć¢ge chez Delphinus delphis",
color = "Sexe",
caption = "DonnƩes : dauphin.xls") +
theme_bw()`geom_smooth()` using formula 'y ~ x'
3. Importez dans R le jeu de donnĆ©es whoTB.csv. Ce jeu de donnĆ©es contient les cas de tuberculose (TB) rapportĆ©s par lāOrganisation Mondiale de la SantĆ© (OMS, ou WHO en anglais : World Health Organization). Les cas sont rĆ©pertoriĆ©s par annĆ©e, pays, Ć¢ge, sexe, type de tuberculose et mĆ©thode de diagnostique. Selon vous, ce jeu de donnĆ©es est-il ārangĆ©ā ? Pourquoi ?
library(readr)
whoTB <- read_csv("whoTB.csv")
āā Column specification āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
cols(
.default = col_double(),
country = col_character(),
iso2 = col_character(),
iso3 = col_character()
)
ā¹ Use `spec()` for the full column specifications.
whoTBCe jeu de donnĆ©es nāest pas rangĆ© car outre les 4 premiĆØres colonnes, toutes les autres contiennent de multiples informations : nouveaux cas ou anciens (ici, ils sont tous nouveaux), type de cas (sp, sn, ep ou rel), sexe des patients (m ou f) et enfin tranches dāĆ¢ges. Nous devrions donc avoir ces 4 variables supplĆ©mentaires, avec pour chaque combinaison possible, le nombre de cas de tuberculose rapportĆ©e dans les colonnes.
4. Si ce jeu de donnĆ©es nāest pas rangĆ©, rangez-le en utilisant les fonctions du packages tidyr que nous avons dĆ©couvertes dans ce chapitre : pivot_longer(), pivot_wider(), separate() et unite() (vous nāaurez pas nĆ©cessairement besoin dāutiliser ces 4 fonctions, et Ć lāinverse, certaines devront peut-ĆŖtre ĆŖtre utilisĆ©es plusieurs fois).
On commence donc par rassembler toutes les colonnes en une seule, nommƩe composite et tous les chiffres dans une colonne cases :
whoTB %>%
pivot_longer(cols = `new_sp_m014`:`new_rel_f65`, names_to = "composite", values_to = "cases")Puisquāils y a beaucoup de donnĆ©es manquantes, on les supprime. Cela nous permet de passer de plus de 400000 lignes Ć environ 76000
whoTB %>%
pivot_longer(cols = `new_sp_m014`:`new_rel_f65`, names_to = "composite",
values_to = "cases", values_drop_na = TRUE)Il nous faut ensuite sƩparer la colonne composite en plusieurs colonnes. On va se servir des _ pour isoler new, le type de cas, et la combinaison SexeAge :
whoTB %>%
pivot_longer(cols = `new_sp_m014`:`new_rel_f65`, names_to = "composite",
values_to = "cases", values_drop_na = TRUE) %>%
separate(col = composite, into = c("new", "type", "SexeAge"))Nous pouvons enfin séparer la colonne SexeAge en 2 en plaçant le premier caractère dans une colonne sexe et le reste dans une colonne age_class :
whoTB %>%
pivot_longer(cols = `new_sp_m014`:`new_rel_f65`, names_to = "composite",
values_to = "cases", values_drop_na = TRUE) %>%
separate(col = composite, into = c("new", "type", "SexeAge")) %>%
separate(col = SexeAge, into = c("sexe", "age_class"), sep = 1)Pour faire bonne mesure, on peut supprimer les colonnes iso2 et iso3 car elles sont redondantes avec country, ainsi que new qui ne contient aucune information. On stocke enfin le rƩsultat dans un tableau nommƩ tidyTB :
tidyTB <- whoTB %>%
pivot_longer(cols = `new_sp_m014`:`new_rel_f65`, names_to = "composite",
values_to = "cases", values_drop_na = TRUE) %>%
separate(col = composite, into = c("new", "type", "SexeAge")) %>%
separate(col = SexeAge, into = c("sexe", "age_class"), sep = 1) %>%
select(-iso2, -iso3, -new)
tidyTBIl est maintenant facile de faire des graphiques exploratoire. Par exemple :
tidyTB %>%
filter(country == "France") %>%
ggplot(aes(x = year, y = cases, color = sexe)) +
geom_line() +
facet_wrap(~age_class, ncol = 2) +
labs(title = "Nouveaux cas de tuberculose en France, de 1995 Ć 2013",
caption = "DonnƩes : OMS")Mise en mƩmoire des packages utiles
library(dplyr)
library(ggplot2)
library(nycflights13)Dans la section 3.3.1, nous avons utilisĆ© la fonction View et lāapplication manuelle de filtres pour dĆ©terminer combien de vols avaient quittĆ© lāaĆ©roport JFK le 12 fĆ©vrier 2013. En utilisant la fonction filter(), crĆ©ez un objet nommĆ© JFK_12fev qui contiendra les donnĆ©es de ces vols. VĆ©rifiez que cet objet contient bien 282 lignes.
JFK_12fev <- flights %>%
filter(origin == "JFK",
month == 2,
day == 12)
JFK_12fevnrow(JFK_12fev)[1] 282
Selon vous, quelles raisons peuvent expliquer quāun vol qui a dĆ©collĆ© nāait pas dāheure dāatterrissage ?
Le vol sāest Ć©crasĆ© ? Plus vraisemblablement, le vol a dĆ» faire demi-tour ou ĆŖtre dĆ©routĆ© suite Ć un problĆØme technique (ou mĆ©tĆ©o ?).
1. Faites un tableau indiquant combien de vols ont été annulés après le décollage, pour chaque compagnie aérienne.
flights %>% # On prend flights, puis
filter(!is.na(dep_time), # On filtre les vols ayant une heure de dƩcollage
is.na(arr_time)) %>% # Mais pas d'heure d'arrivƩe, puis
group_by(carrier) %>% # On groupe par compagnie aƩrienne, puis
summarize(cancelled = n()) # On compte le nombre de lignes par groupe2. Faites un tableau indiquant les vitesses de vents minimales, maximales et moyennes, enregistrƩes chaque mois dans chaque aƩroport de New York.
weather %>%
group_by(origin, month) %>%
summarize(max_wind = max(wind_speed, na.rm = TRUE),
min_wind = min(wind_speed, na.rm = TRUE),
moy_wind = mean(wind_speed, na.rm = TRUE))`summarise()` has grouped output by 'origin'. You can override using the `.groups` argument.
3. Sachant que les vitesses du vent sont exprimĆ©es en miles par heure, certaines valeurs sont-elles surprenantes ? Ć lāaide de la fonction filter(), Ć©liminez la ou les valeurs aberrantes.
Une valeur de plus de 1000 mph est impossible. Il sāagit vraisemblablement dāune erreur de saisie ou dāenregistrement.
weather %>%
filter(wind_speed <= 500) %>%
group_by(origin, month) %>%
summarise(max_wind = max(wind_speed, na.rm = TRUE),
min_wind = min(wind_speed, na.rm = TRUE),
moy_wind = mean(wind_speed, na.rm = TRUE))`summarise()` has grouped output by 'origin'. You can override using the `.groups` argument.
4. En utilisant les donnƩes de vitesse de vent du tableau weather, produisez le graphique suivant.
weather %>%
filter(wind_speed < 500) %>%
ggplot(aes(x = factor(month), y = wind_speed)) +
geom_jitter(width = 0.2, height = 0, alpha = 0.2) +
labs(x = "Mois",
y = "Vitesse du vent (mph)")Selon vous, pourquoi les points sont-ils organisĆ©s en bandes horizontales ? Selon vous, pourquoi nāy a tāil jamais de vent entre 0 et environ 3 miles Ć lāheure (mph) ?
Lāappareil de mesures nāenregistre que des vitesses de vent par incrĆ©ment fixe et son seuil de dĆ©tection est supĆ©rieur Ć des vitesses de 3mph. Cela explique les bandes et le trou entre 0 et 3 mph.
Sachant quāen divisant des mph par 1.151 on obtient des vitesses en nÅuds, que nous apprend cette commande :
sort(unique(weather$wind_speed))/1.151 [1] 0.000000 2.999427 3.999235 4.999044 5.998853 6.998662 7.998471 8.998280 9.998089 10.997897 11.997706 12.997515 13.997324 14.997133 15.996942 16.996751 17.996560 18.996368 19.996177 20.995986 21.995795 22.995604 23.995413 24.995222 25.995030 26.994839 27.994648 28.994457 29.994266 30.994075 31.993884 32.993692 33.993501 34.993310 36.992928 910.825873
Ici, on convertit les donnĆ©es de vitesse de vent de mph en nÅuds. La fonction unique() permet dāĆ©liminer les duplicats et sort() trie les donnĆ©es en ordre croissant. On voit donc que seules quelques valeurs de vent sont enregistrĆ©es. Lāenregistreur est inacpable de dĆ©tecter moins de 3 nÅuds de vent, et ensuite, il enregistre des valeurs entiĆØres (3, 4, 5, et ainsi de suite jusquāau maximum de 37 nÅuds).
1. Dans ggplot2 le jeu de donnĆ©es mpg contient des informations sur 234 modĆØles de voitures. Examinez ce jeu de donnĆ©es avec la fonction View() et consultez lāaide de ce jeu de donnĆ©es pour savoir Ć quoi correspondent les diffĆ©rentes variables. Quelle(s) variable(s) nous renseignent sur la consommation des vĆ©hicules ? Ć quoi correspond la variable disp ?
Les variables hwy et cty nous renseignent sur la consommation des vƩhicules sur autoroute et en ville respectivement. Les consommations sont donnƩes en miles per galon. disp est la cylindrƩe du moteur, son volume en litres.
2. La consommation est donnée en miles par gallon. Créez une nouvelle variable conso qui contiendra la consommation exprimée en nombre de litres pour 100 kilomètres.
mpg %>%
mutate(conso = 235.215 / hwy)3. FaĆ®tes un graphique prĆ©sentant la relation entre la cylindrĆ©e en litres et la consommation sur autoroute exprimĆ©e en nombre de litres pour 100 kilomĆØtres. Vous excluerez les vĆ©hicules dont la classe est 2seater de ce graphique (il sāagit de voitures de sports trĆØs compactes quāil est difficile de mesurer aux autres). Sur votre graphique, la couleur devrait reprĆ©senter le type de vĆ©hicule. Vous ajouterez une droite de rĆ©gression en utilisant geom_smooth(method = "lm").
mpg %>%
filter(class != "2seater") %>%
mutate(conso = 235.215 / hwy) %>%
ggplot(aes(x = displ, y = conso)) +
geom_point(aes(color = class)) +
geom_smooth(method = "lm") +
labs(x = "CylindrƩe (volume du moteur en litres)",
y = "Consommation (litres pour 100 kilomĆØtres)",
color = "Type de\nvƩhicule",
title = "Relation positive entre cylindrƩe et consommation") +
theme_minimal(base_family = "Gill Sans")`geom_smooth()` using formula 'y ~ x'
*4. Ce graphique prĆ©sente-tāil correctement lāensemble des donnĆ©es de ces 2 variables ? Pourquoi ? Comparez le graphique de la question 3 ci-dessus et le graphique prĆ©sentĆ© ci-dessous. Selon vous, quels arguments et/ou fonctions ont Ć©tĆ© modifiĆ©s pour arriver Ć ce nouveau graphique ? Quels sont les avantages et les inconvĆ©nients de ce graphique par rapport au prĆ©cĆ©dent ?
mpg %>%
filter(class != "2seater") %>%
mutate(conso = 235.215 / hwy) %>%
ggplot(aes(x = displ, y = conso)) +
geom_jitter(aes(fill = class), shape = 21, width = 0.05, height = 0.05, alpha = 0.7) +
geom_smooth(method = "lm") +
labs(x = "CylindrƩe (volume du moteur en litres)",
y = "Consommation (litres pour 100 kilomĆØtres)",
fill = "Type de\nvƩhicule",
title = "Relation positive entre cylindrƩe et consommation") +
theme_minimal(base_family = "Gill Sans")`geom_smooth()` using formula 'y ~ x'
On utilise geom_jitter() au lieu de geom_point() pour que les points ne se superposent plus. On voit donc mieux les données. Néanmoins, les points sont légèrement déplacés, ce graphique est donc moins précis que le premier. Il est plus inexact.
Les symboles ont aussi Ć©tĆ© changĆ©s : on est passĆ© Ć des points avec contour (shape = 21) auquels on a attribuĆ© une transparence (toujours pour mieux visualiser les chevauchements de points). Du coup, ce nāest plus la color qui est associĆ©e Ć la classe de vĆ©hicule, mais fill, la couleur de remplissage.
1. CrĆ©ez un tableau delayed indiquant, pour chaque compagnie aĆ©rienne et chaque mois de lāannĆ©e, le nombre de vols ayant eu un retard supĆ©rieur Ć 30 minutes Ć lāarrivĆ©e Ć destination. Ce tableau devrait contenir uniquement 3 colonnes :
carrier : la compagnie aĆ©riennemonth : le mois de lāannĆ©e 2013n_delayed : le nombre de vols ayant plus de 30 minutes de retard# Calcul du nombre de vols en retard (+ de 30 min Ć l'arrivĆ©e) pour chaque compagnie et chaque mois
delayed <- flights %>%
filter(arr_delay > 30) %>%
group_by(carrier, month) %>%
summarize(n_delayed = n(), .groups = "drop")
delayed2. CrĆ©ez un tableau total indiquant le nombre total de vols affrĆ©tĆ©s (et non annulĆ©s) par chaque compagnie aĆ©rienne et chaque mois de lāannĆ©e. Ce tableau devrait contenir seulement 3 colonnes :
carrier : la compagnie aĆ©riennemonth : le mois de lāannĆ©e 2013n_total : le nombre total de vols arrivĆ©s Ć destination# Calcul du nombre total de vols non annulĆ©s pour chaque compagnie et chaque mois
total <- flights %>%
filter(!is.na(arr_delay)) %>%
group_by(carrier, month) %>%
summarize(n_total = n())`summarise()` has grouped output by 'carrier'. You can override using the `.groups` argument.
total3. Fusionnez ces 2 tableaux en rĆ©alisant la jointure appropriĆ©e. Le tableau final, que vous nommerez carrier_stats devrait contenir 185 lignes. Si certaines colonnes contiennent des donnĆ©es manquantes, remplacez-les par des 0 Ć lāaide des fonctions mutate() et na_replace().
4. Ajoutez Ć votre tableau carrier_stats une variable rate qui contient la proportion de vols arrivĆ©s Ć destination avec plus de 30 minutes de retard, pour chaque compagnie aĆ©rienne et chaque mois de lāannĆ©e.
5. Ajoutez à votre tableau carrier_stats le nom complet des compagnies aériennes en réalisant la jointure appropriée avec le tableau airlines.
# Création du tableau de synthèse (2 left_join())
carrier_stats <- total %>%
left_join(delayed) %>%
mutate(n_delayed = replace_na(n_delayed, 0),
rate = n_delayed / n_total) %>%
left_join(airlines)Joining, by = c("carrier", "month")
Joining, by = "carrier"
carrier_stats6. Faites un graphique synthƩtique prƩsentant ces rƩsultats de la faƧon la plus claire possible
7. Quelle compagnie aérienne semble se comporter très différemment des autres ? à quoi pouvez-vous attribuer ce comportement atypique ?
La compagnie OO (SkyWest Airlines Inc.) a un comportement trĆØs atypique dĆ» au trĆØs faible nombre de vols affrĆ©tĆ©s (1 seul en janvier, 2 en juin, 4 en aoĆ»t, 17 en septembre et 5 en novembre). Elle nāest dāailleurs prĆ©sente que quelques mois de lāannĆ©e dans les aĆ©roports de New York.
carrier_stats %>%
filter(carrier == "OO")8. Pour les compagnies affrétant un grand nombre de vols chaque année (e.g. UA, B6 et EV), quelles sont les périodes où les plus fortes proportions de vols en retard sont observées ? Et les plus faibles ? Quelle(s) hypothèse(s) pouvez-vous formuler pour expliquer ces observations ?
Pour les plus grosses compagnies, les retards les plus frĆ©quents sont observĆ©s lāĆ©tĆ©, et les moins frĆ©quents en automne. Cela correspond aux pĆ©riodes de trĆØs fortes affluences en Ć©tĆ©, et au moins fortes affluences Ć la rentrĆ©e de septembre. Cāest du moins le cas pour UA et B6. Moins pour EV.
carrier_stats %>%
filter(carrier %in% c("UA", "B6", "EV")) %>%
select(carrier, month, n_total) %>%
pivot_wider(names_from = carrier,
values_from = n_total)carrier_stats %>%
filter(carrier %in% c("UA", "B6", "EV")) %>%
ggplot(aes(x = factor(month), y = n_total, group = carrier, color = carrier)) +
geom_line()9. Faites un tableau synthétique présentant ces résultats de la façon la plus compacte et claire que possible, afin par exemple de les intégrer à un rapport.